Intro and Methods

In this analysis I demonstrate the existence of a network of automated retweet bots that amplify a large set of establishment Democrats and members of “Resistance Twitter”. For data collection, I used the Twitter Search API via the rtweet r package to obtain retweeters of various accounts in different communities.

Two primary analyses were used to examine the retweeter data sets for each account, the first being account creation date distributions. When analyzing followers or retweeters for suspicious patterns, the date an account is created is a useful feature to look at because it is immutable. A user’s account creation date (i.e. when they joined twitter) cannot be changed by the account owner, so it is useful for observing interesting patterns associated with clusters of accounts created within short time spans. I recommend the NY Times Follower Factory article for relevant background regarding how account creation date patterns can reveal fake, often purchased, bot followers. In contrast to the NY Times article, this analysis focuses on the account creation dates of users that retweet particular accounts, rather than followers.

The second analysis, using a machine learning classification technique, was a probability estimate of an account being a bot. For this, I used the tweetbotornot r package to estimate the probability of each retweeter being an automated account. As in the account creation date analysis, distributions of bot probabilities were visualized to examine a large number of accounts at once. The fast version of the algorithm can be tested here on single accounts using account-level (bio, tweet volume, follower and friend count, etc.) data only. To obtain a more accurate estimate of whether an account is a bot or not, tweet-level (capitalization, hashtag use, mentions, etc.) data was used in addition to the account-level data. In the following analysis, tweet-level data consisted of retweeter’s most recent 100 tweets. The gradient boosted model (using the gbm package) used the combination of account and tweet-level data to estimate the probability that each retweeting account is a bot.

The proceeding sections are organized as such:

  1. Data collection methodology

  2. Account creation date analysis
    • Examples
      • Account creation date analysis using 10,000 retweeters of @Shareblue
      • account creation date analysis comparison between two accounts
    • Comparison of account creation date analyses across communities using 2,400 retweeters per account
  3. Bot probability estimates
    • Example
      • Bot probability analysis using 10,000 retweets of @Shareblue
      • Bot probably analysis comparison between two accounts
    • Comparison of bot probabilities across communities using 2,400 retweets per account
    • Alternate visualizations of bot probabilities
  4. Combined account creation date and bot probability analysis

  5. Conclusions and future directions

Retweeter data collection

To obtain only retweets of an specific account (i.e. @Shareblue) from the Search API, mentions and original tweets were discarded by filtering out all tweets that did not have “Shareblue” in the retweet_screen_name field. This process was repeated until 10,000 recent retweets were gathered from 5,585 unique accounts. This process produced account-level data which includes the account creation date. To obtain unique retweeters only, this process can be repeated in conjunction with filtering to obtain only distinct user accounts.

Account Creation Dates

Example using Shareblue retweeters

Below is a histogram of the account creation dates from the 10,000 retweet @Shareblue retweet data set. The data displays account creation dates from 5,585 unique retweeters. Make note of the large spike in accounts created around 2009 and early 2017. The 2009 spike is thought to be Twitter’s banner year, when it really caught on and everyone made and account. These spikes in account creation dates can be observed around the time Twitter went mainstream other countries. But what could explain the huge spike in account creations around January 2017 that retweet Shareblue? An organic explanation could be that these accounts were created by real people around the time of the inauguration to resist Trump on Twitter.

Example comparing two accounts

Now lets compare the account creation date distributions of retweeters from two different accounts. Here, I have collected 2400 recent unique retweeters from @dril and @peterdaou to illustrate. Here, the distribution of join dates for @dril is relatively flat, while @peterdaou’s retweeters have strong spikes in their account creation dates around 2009 and January 2017.

Comparing accounts across Twitter communities

The following section compares account creation date distributions within various Twitter communities or regions. Comparing between regions allows us to examine how the January 2017 peak differs between accounts and across regions.

Shareblue region

First up are Shareblue affiliated accounts. The Jan ’17 join date spikes can be observed in the retweeter distributions of each account to varying degrees.

Rightwinger region

The join date histograms of the right-wing accounts look totally different than the distributions observed above.

Weird region

Again we see totally different set of similar looking distributions of account created dates of their retweeters. The 2009 spike is the one consistent feature observed on all accounts, while the Jan. ’17 spike is notably absent.

Lefty region

This set of lefty accounts appears more similar to the distributions in the Weird region. The promenade spikes near 2017 on 2-3 of these accounts actually occurred around 6 months prior to Jan ’17.

Podcast region

The largest spike is seen on @aravosis, a conservative democrat. Then @jonfavs followed by @jonlovett also saw the spike but to less of a degree.

Journalist region

Here the largest signal is observed on the founder of Lawfare. Smaller spikes are seen for writers for Vox and Daily Beast.

Publication region

The signal is apparent for Shareblue and PalmerReport. It is difficult to tell how much is there for NYT and ThinkProg.

Resist region

The Jan ’17 spike is incredibly prominent in these big resistance accounts.

TV Region

Liberal television news pundits also display the Jan’ 17 signal, to varying degrees.

Russiagate Region

Again, same signal.

#StillWithHer region

Again we see the signal present for accounts that are establishment democrat defenders.

2020 Presidential region

Here it is clear that the 2017 signal is less apparent on both of Senator Sander’s accounts, however it is strong on the other accounts.

Bot probability estimates

In this section, histograms of bot probabilities are used to examine the distribution of real to fake accounts that retweet each account analyzed. 100 tweets from each retweeter’s timeline were collected and combined with the account-level date in order to provide a probability estimate of each retweeter being a bot.

Example data output after classification:

Example using Shareblue retweeters

Below is a histogram of the estimated bot probabilities of the 5,585 unique accounts that retweeted Shareblue.

The distribution is highly skewed-right, indicating that many of these accounts analyzed are highly likely to be automated bots.

Example comparing two accounts

Now lets compare bot probability estimate distributions of retweeters from two different accounts. I have collected 2400 unique retweeters from @dril and @peterdaou, then 100 tweets from each retweeter’s timeline, and finally classified each retweeter.

We can see that dril’s retweeters are skewed left (less likely to be bots) with a large peak. The distribution is U-shaped, with a smaller peak of about 100 accounts that are highly likely to be automated. The opposite is true in Peter Daou’s case, with the peak of probability estimates around 90%.

The most important outcome variable is the shape of the probability distribution. If it is a perfect U shape with steep peaks, then the account in question is likely retweeted by a mix of obvious humans and bots. Left skew indicates that there are more retweeters classified as human than bots. Right skew indicates that retweets are more likely automated. If the distribution is flat or convex, this would indicate a deeper issue with the classifier itself. If it is performing properly, there should be either U-shape or skewed distributions of probability estimates.

In the following analyses, 2400 retweets and retweeter user/tweet data was collected to produce probability estimate distributions for the account being analyzed. For tweet-level data collection, 100 recent tweets from each retweeter’s timeline were obtained through the API.

Shareblue region

Shareblue employees and affiliates had similarly skewed-right distributions, indicating that their retweeters are more likely to be be automated accounts.

Rightwinger Region

Here we see more U shaped distributions, but each distribution also skews-right to varying degrees.

Weird region

This region of accounts appears to have a the least amount of automated retweets, indicated by the skewed left and U-shape distributions.

Lefty region

These mostly U-shaped distributions indicate a mix of real and automated retweeters.

Podcast region

Podcaster accounts very greatly in their bot probability distributions. Two accounts skew-right while the others are mostly U-shape or skew-left.

Journalist region

Here we see a large mix of distribution shapes. @ebruenig was the most skewed-left distribution of all accounts analyzed.

Publication region

Here we have another mix of distributions. Shareblue and Palmer skew heavily right, indicating artificial boosting. The other 3 besides Jacobin skew-right but still have clear U-shapes. Jacobin is the one one to skew left.

Resist region

These distributions look similar to those in the Shareblue region, with heavy right-skew.

TV Region

These distributions are highly skewed-right, but each also has a slight U-shape. This indicates a contingent of real retweeters among many automated ones.

RussiaGate region

These distributions look much like Shareblue, and Resist regions, with hard right-skew. However most distributions also have a mode towards 0%, similar to the TV region distributions.

#StillWithHer

More of the same looking distributions as the resist region. Skewed-right by varying degree.

2020 Presidential region

This set is interesting, all except for @BernieSanders and @SenSanders have a decent right-skew. Sanders accounts have a right skew, but also have more of a U-shape.

Visualizing it all together

2020 Presidential region only

Looking at separate histograms across different twitter regions is tough to interpret. The density ridgeline plot allows for multiple distributions to be viewed in the a space similar in size to a single histogram.

Here is the density ridge plot of the same data from the previous set of 2020 presidential region histograms. The added color, representing density, aids visual comprehension of peaks and modes. The uppermost distribution has the lowest mean retweeter bot probability distribution, and the lowermost distribution always has the greatest mean bot probability.

All regions, seperate

Here all regions are grouped and displayed in the same plot. The overall skew of the groups as well as individual distributions are easily interpreted.

All regions, combined

Here the density ridgelines are stacked which allows for quicker comparisons between accounts in different regions.

Combined Join Date and Bot Probability Analysis

The spikes in retweeters with join dates in January of 2017 are suspicious. A really strong signal seems to be primarily present on “Resistance” and mainstream establishment Democrat accounts. To see whether the accounts with Jan 2017 join dates are more likely to be classified as bots, we will first combine the bot probability data sets that have the 2017 signature:

Scatter plot of all #Resistance accounts

A scatter plot with very low alpha on the points gives an idea of where accounts are concentrated in terms of join date and bot probability.

Heat maps

#Resistance accounts, combined

Visualizing the data using a heat map helps to visualize when bot accounts were created. Many bot accounts were created during 2009. 2009 was the most frequently observed account creation year, and it also had the greatest number of real accounts. Interestingly, a high concentration of bot accounts that have early 2017 join dates was also observed.

#Resistance accounts, seperate

To see how uniform the bot creation dates are across accounts we can plot the same visualization for each account that was retweeted.

Density plots

The above heat maps are similar to histograms in that they use bins to split up the data.

The plot below uses the 2d density to map the color fill value to. This smoothed visualization makes it easier to compare densities of account creation dates and bot probabilities across accounts.

#Resistance accounts, combined

#Resistance accounts, seperate

The strongest signal is observed on Maddow’s account.

Comparison of TV with other regions

Now, lets compare accounts in the TV region with the lefty and weird regions.

2020 Presidential region

Finally, lets compare the presidential hopefuls. It looks like Kamala Harris has the most 2017 retweet bots of these accounts, followed by Joe Kennedy and Joe Biden. Neither of Bernie Sanders’ accounts are boosted by automated retweet bots to the degree that Kamala Harris or Joe Kennedy are.

Follower analysis

I have also observed accounts created around January 2017 that have been following, in addition to retweeting, the accounts in question. For example, @KamalaHarris has been receiving follows from accounts created in Jan ’17 since shortly after the senator’s account was created. It appears that these bot follows are engineered to provide a sustained flow of new followers to the account over a long period of time. This is evidenced by the horizontal cluster of follows created around Jan’17. Adding new bot follows to an account at a slow and sustained pace accomplishes a few things, 1) people don’t get suspicious when an account gains 100k followers overnight, 2) no burst of followers means that the “crust at the top” due to the “join and follow” phenomena described in the NYT article remains unbroken (purchasing followers in bulk often breaks the continuity of the dark crust at the top of the plot), and 3) sustaining the flow of new followers likely helps to keep an account trending for longer than it would have otherwise so the account shows up in suggested follows, etc.

Conclusion

It is clear from the above analyses that there are automated retweet bots that boost those who are in and/or defend the establishment Democrat party.

These amplifier accounts don’t retweet from third-party clients (like Sally Albright was doing) so their existence must be confirmed statistically– they are invisible to a single API call to get the source client. They appear to use (or emulate) android, iPhone, and web client source clients at about equal rates. Further, the accounts do not have reverse-image searchable profile pictures– they are typically pictures of pets, logos, or obscured faces.

The scope of this AstroTurf operation is vast. Creation of an automated account network this advanced likely involved a massive technical and financial undertaking.

Future directions

Next steps are to:

  1. Get a better idea for the scope of the bot net
    • How big is it?
    • Is it still growing?
  2. Reverse engineer how the network operates
    • Track down the watcher bots and the amplifiers
    • Are they idle waiting to get activated, or posting constantly?
  3. Narrow down the Jan’17 accounts that are likely bots
    • Confirm that they are using time mapping analyses.
    • Use this to develop a more direct way of identifying bots in the network
LS0tDQp0aXRsZTogIkF1dG9tYXRpb24gYW5kIGZha2UgYWNjb3VudHMgYWNyb3NzIFR3aXR0ZXIgY29tbXVuaXRpZXMiDQphdXRob3I6ICJAbGlraW5nb25saW5lIg0Kc3VidGl0bGU6ICdBbmFseXNpcyBvZiByZXR3ZWV0ZXIgYWNjb3VudCBjcmVhdGlvbiBkYXRlcyBhbmQgYm90IHByb2JhYmlsaXRpZXMnDQpkYXRlOiAiMDctMTgtMTgiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCg0KLS0tDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShydHdlZXQpDQpsaWJyYXJ5KGJvdHJub3QpDQpsaWJyYXJ5KG11bHRpZHBseXIpDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KbGlicmFyeSh2aXJpZGlzKQ0KDQojc2F2ZShyZXNpc3Qsc2hhcmVibHVlX3JlZ2lvbixjaHVkLGRvbnV0LG1zbmJjLGxlZnQsIHJ1c3NpYSwgcG9kY2FzdCxqb3Vybm9zLHNhbmRlcnMsIHdlaXJkLCBtZWRpYSwgZmlsZSA9ICJyZWdpb25zX2JvdHMucmRhdGEiKQ0KI3NhdmUoY29tYiwgZmlsZSA9ICJjb21iaW5lZF9yZWdpb25zLnJkYXRhIikNCg0KbG9hZCgiY29tYmluZWRfcmVnaW9ucy5yZGF0YSIpDQpsb2FkKCIuL2JvdHJub3RfZGF0YS9zaGFyZWJsdWVfcnRfYm5fMTAwMDAucmRhdGEiKQ0KbG9hZCgicmVnaW9uc19ib3RzLnJkYXRhIikNCmxvYWQoImRyaWxkb3UiKQ0KDQpyZXNpc3RhbmNlPC1yYmluZChkb251dCxydXNzaWEsbXNuYmMscmVzaXN0LHNoYXJlYmx1ZV9yZWdpb24pDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OX0NCg0KcGxvdF9ib3Rwcm9iX3JpZGdlczwtZnVuY3Rpb24oLi4uLCBmaWxsID0gImRlbnMiLCBhbHBoYSA9IDEsIHNjYWxlID0gMiwgb3B0aW9uID0gIkQiKXsNCiAgICBkZjwtcmJpbmQoLi4uKSU+JQ0KICAgIGdyb3VwX2J5KHJldHdlZXRfc2NyZWVuX25hbWUpJT4lDQogICAgbXV0YXRlKG1lYW5fcGI9KHByb2JfYm90KSklPiUNCiAgICBhcnJhbmdlKGRlc2MobWVhbl9wYikpDQogIGlmKGZpbGwgPT0gImRlbnMiKXsNCiAgZyA8LSBkZiAlPiUgZ2dwbG90KGFlcyh4PXByb2JfYm90LCB5ID0gcmVvcmRlcihyZXR3ZWV0X3NjcmVlbl9uYW1lLCAtbWVhbl9wYiksIGZpbGwgPSAuLmRlbnNpdHkuLikpDQogICAgICBnIDwtIGcgKyBnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KHNjYWxlID0gc2NhbGUsIHNob3cubGVnZW5kID0gRikrDQogICAgICAgIHNjYWxlX2ZpbGxfdmlyaWRpcygpDQoNCiAgICB9IGVsc2Ugew0KICAgICAgICBnPC1kZiU+JWdncGxvdChhZXMocHJvYl9ib3QpKQ0KICAgICAgZzwtZytnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KHNjYWxlID0gc2NhbGUsIGZpbGwgPSBmaWxsLCAgYWxwaGEgPSBhbHBoYSwgc2hvdy5sZWdlbmQgPSBGKSsNCiAgICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKCkNCg0KICAgIH0NCiAgZyArIHNjYWxlX3hfcGVyY2VudChicmVha3MgPSBjKDAsLjI1LC41MCwuNzUsMSkpKw0KICAgIGxhYnMoeCA9ICJCb3QgUHJvYmFiaWxpdHkiLCB5ID0gIkNvdW50IikrDQogICAgdGhlbWVfaXBzdW0oInNhbnMiLCBncmlkID0gIlgiKQ0KfQ0KDQpwbG90X2JvdHByb2JfaGlzdDwtZnVuY3Rpb24oLi4uLCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLCBhbHBoYSA9IDEsIGJpbnMgPSA1MCl7DQogICAgZGY8LXJiaW5kKC4uLiklPiUNCiAgICBncm91cF9ieShyZXR3ZWV0X3NjcmVlbl9uYW1lKSU+JQ0KICAgIG11dGF0ZShtZWFuX3BiPShwcm9iX2JvdCkpJT4lDQogICAgYXJyYW5nZShkZXNjKG1lYW5fcGIpKQ0KICBpZihjb2xvciA9PSAicmV0d2VldGVkIil7DQogIGcgPC0gZGYgJT4lIGdncGxvdChhZXMocHJvYl9ib3QpKQ0KICAgICAgZyA8LSBnICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGNvbG9yID0gcmV0d2VldF9zY3JlZW5fbmFtZSksIGJpbnMgPSBiaW5zLCBmaWxsID0gZmlsbCwgYWxwaGEgPSBhbHBoYSwgc2hvdy5sZWdlbmQgPSBGKSsNCiAgICAgICAgICAgIGZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpKw0KICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX2lwc3VtKCkNCg0KICAgIH0gZWxzZSB7DQogICAgICAgIGc8LWRmJT4lZ2dwbG90KGFlcyhwcm9iX2JvdCkpDQogICAgICBnPC1nK2dlb21faGlzdG9ncmFtKGNvbG9yID0gY29sb3IsIGZpbGwgPSBmaWxsLCBiaW5zID0gYmlucywgYWxwaGEgPSBhbHBoYSwgc2hvdy5sZWdlbmQgPSBGKQ0KDQogICAgfQ0KICBnICsgc2NhbGVfeF9wZXJjZW50KGJyZWFrcyA9IGMoMCwuMjUsLjUwLC43NSwxKSkrDQogICAgbGFicyh4ID0gIkJvdCBQcm9iYWJpbGl0eSIsIHkgPSAiQ291bnQiKSsNCiAgICB0aGVtZV9pcHN1bSgic2FucyIsIGdyaWQgPSAiWSIpDQp9DQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCnBsb3RfY3JlYXRlZF9hdF9oaXN0PC1mdW5jdGlvbiguLi4sIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIsIGFscGhhID0gMSwgYmlucyA9IDEwMCl7DQogIGRmPC1yYmluZCguLi4pDQogIGlmKGNvbG9yID09ICJyZXR3ZWV0ZWQiKXsNCiAgICAgIGcgPC0gZGYlPiUgZ2dwbG90KGFlcyhhY2NvdW50X2NyZWF0ZWRfYXQpKQ0KICAgICAgZyA8LSBnICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGNvbG9yID0gcmV0d2VldF9zY3JlZW5fbmFtZSksIGJpbnMgPSBiaW5zLCBmaWxsID0gZmlsbCwgYWxwaGEgPSBhbHBoYSwgc2hvdy5sZWdlbmQgPSBGKSsNCiAgICBmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKSsNCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX2lwc3VtKCkNCg0KICAgIH0gZWxzZSB7DQogICAgICBnPC1kZiU+JWdncGxvdChhZXMoYWNjb3VudF9jcmVhdGVkX2F0KSkNCiAgICAgIGc8LWcrZ2VvbV9oaXN0b2dyYW0oYmlucyA9IGJpbnMsIGZpbGwgPSBmaWxsLCBjb2xvciA9IGNvbG9yLCBhbHBoYSA9IGFscGhhLCBzaG93LmxlZ2VuZCA9IEYpDQogICAgfQ0KICBnICsgDQogICAgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIyIHllYXIiLCBkYXRlX2xhYmVscyA9ICInJXkiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHllYXIiKSsNCiAgICBsYWJzKHggPSAiQWNjb3VudCBDcmVhdGVkIiwgeSA9ICJDb3VudCIpKw0KICAgIHRoZW1lX2lwc3VtKCJzYW5zIiwgZ3JpZCA9ICJZIikNCn0NCmBgYA0KDQpgYGB7ciBldmFsPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05LCBpbmNsdWRlPUZBTFNFfQ0KDQpyZXNpc3Q8LXJiaW5kKEVkS3Jhc3NlbiwgDQogICAgICAgICAgICAgIFNvY2lhbFBvd2VyT25lMSwNCiAgICAgICAgICAgICAgZnVuZGVyLCANCiAgICAgICAgICAgICAga3Jhc3NlbnN0ZWluLA0KICAgICAgICAgICAgICB3aWxsaWFtbGVnYXRlLA0KICAgICAgICAgICAgICBtY3Nwb2NreQ0KICAgICAgICAgICAgICApJT4lbXV0YXRlKFJlZ2lvbiA9ICJSZXNpc3QiKQ0KDQpzaGFyZWJsdWVfcmVnaW9uPC1yYmluZChlcmljYm9laGxlcnQsDQogICAgICAgICAgICAgICAgIG93aWxsaXMsDQogICAgICAgICAgICAgICAgIGZhd2Z1bGZhbiwNCiAgICAgICAgICAgICAgICAgUlZBd29uaywNCiAgICAgICAgICAgICAgICAgcGV0ZXJkYW91LA0KICAgICAgICAgICAgICAgICB0b213YXRzb24NCiAgICAgICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiU2hhcmVibHVlIikNCg0KZG9udXQ8LXJiaW5kKE1yRGFuZTE5ODIsDQogICAgICAgICAgICAgQnJhdmVuYWtCbG9nLA0KICAgICAgICAgICAgIEFkYW1QYXJraG9tZW5rbywNCiAgICAgICAgICAgIFBoaWxpcHBlUmVpbmVzLA0KICAgICAgICAgICAgSG9hcnNlV2lzcGVyZXIsIA0KICAgICAgICAgICAgbmVlcmF0YW5kZW4NCiAgICAgICAgICAgICApJT4lbXV0YXRlKFJlZ2lvbiA9ICJTdGlsbFdpdGhIZXIiKQ0KDQpjYXA8LXJiaW5kKENBUEFjdGlvbiwNCiAgICAgICAgICAgbmVlcmF0YW5kZW4sDQogICAgICAgICAgIFRvcGhlclNwaXJvLA0KICAgICAgICAgICBKdWRkTGVndW0NCiAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiQ0FQIikNCg0Kd2VpcmQ8LXJiaW5kKGRyaWwsIA0KICAgICAgICAgICAgSW50ZXJuZXRIaXBwbywgDQogICAgICAgICAgICBLcmFuZ1ROZWxzb24sDQogICAgICAgICAgICBwaXhlbGF0ZWRib2F0LA0KICAgICAgICAgICAgQkFLS09PT05OLA0KICAgICAgICAgICAgZmFydA0KICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiV2VpcmQiKQ0KDQpsZWZ0PC1yYmluZChicmllYnJpZWpveSwNCiAgICAgICAgICAgIGJvdXJnZW9pc2FsaWVuLA0KICAgICAgICAgICAgaGlzdG9yeWluZmxpY2tzLA0KICAgICAgICAgICAgY3J1c2hpbmdib3J0LA0KICAgICAgICAgICAgY2xhc3NpY2xpYjNyYWwsDQogICAgICAgICAgICBqaW1teV9kb3JlDQogICAgICAgICAgICApJT4lbXV0YXRlKFJlZ2lvbiA9ICJMZWZ0eSIpDQoNCmpvdXJub3M8LXJiaW5kKA0KICAgICAgICAgICAgZWJydWVuaWcsDQogICAgICAgICAgICBhZGFtam9obnNvbk5ZQywNCiAgICAgICAgICAgIGtlbmtsaXBwZW5zdGVpbiwNCiAgICAgICAgICAgIGV6cmFrbGVpbiwNCiAgICAgICAgICAgIGJlbmphbWlud2l0dGVzLA0KICAgICAgICAgICAgZ2dyZWVud2FsZA0KICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiV3JpdGVycyIpDQoNCg0Kc2FuZGVyczwtcmJpbmQoU2VuU2FuZGVycywNCiAgICAgICAgICAgICAgIEJlcm5pZVNhbmRlcnMsDQogICAgICAgICAgICAgICBTZW5XYXJyZW4sDQogICAgICAgICAgICAgICBLYW1hbGFIYXJyaXMsDQogICAgICAgICAgICAgICBKb2VCaWRlbiwNCiAgICAgICAgICAgICAgIFJlcEpvZUtlbm5lZHkNCiAgICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiMjAyMCIpDQoNCmNodWQ8LXJiaW5kKGNoYXJsaWVraXJrMTEsIA0KICAgICAgICAgICAgQ2Vybm92aWNoLA0KICAgICAgICAgICAgSmFja1Bvc29iaWVjLA0KICAgICAgICAgICAgUHJpc29uUGxhbmV0LA0KICAgICAgICAgICAgam9yZGFuYnBldGVyc29uLA0KICAgICAgICAgICAgZ2V0b25nYWINCiAgICAgICAgICAgICklPiVtdXRhdGUoUmVnaW9uID0gIlJpZ2h0V2luZ2VycyIpDQoNCm1zbmJjPC1yYmluZChjaHJpc2xoYXllcywNCiAgICAgICAgICAgICBtYWRkb3csDQogICAgICAgICAgICAga3lsZWdyaWZmaW4xLA0KICAgICAgICAgICAgIEpveUFublJlaWQsDQogICAgICAgICAgICAgamFrZXRhcHBlciwNCiAgICAgICAgICAgICBhbmFuYXZhcnJvDQogICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiVFYiKQ0KDQpydXNzaWE8LXJiaW5kKE1hbGNvbG1OYW5jZSwNCiAgICAgICAgICAgICAgdHJpYmVsYXcsDQogICAgICAgICAgICAgIGVyaWNnYXJsYW5kLA0KICAgICAgICAgICAgICBTZXRoQWJyYW1zb24sDQogICAgICAgICAgICAgIEJpbGxLcmlzdG9sLA0KICAgICAgICAgICAgICB0MjBjb21taXR0ZWUNCiAgICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiUnVzc2lhR2F0ZSIpDQoNCm1lZGlhPC1yYmluZCh0aGVpbnRlcmNlcHQsDQogICAgICAgICAgICAgbnl0aW1lcywNCiAgICAgICAgICAgICBQYWxtZXJSZXBvcnQsDQogICAgICAgICAgICAgamFjb2Jpbm1hZywNCiAgICAgICAgICAgICB0aGlua3Byb2dyZXNzLA0KICAgICAgICAgICAgIHNoYXJlYmx1ZTI0MDANCiAgICAgICAgICAgICApJT4lbXV0YXRlKFJlZ2lvbiA9ICJQdWJsaWNhdGlvbnMiKQ0KDQpwb2RjYXN0PC1yYmluZChCeVlvdXJMb2dpYywNCiAgICAgICAgICAgICAgIGJvcmluZ19hc19oZWNrLA0KICAgICAgICAgICAgICAgam9ubG92ZXR0LA0KICAgICAgICAgICAgICAgam9uZmF2cywNCiAgICAgICAgICAgICAgIGFyYXZvc2lzLA0KICAgICAgICAgICAgICAgTWF0dEJpbmRlcg0KICAgICAgICAgICAgICAgKSU+JW11dGF0ZShSZWdpb24gPSAiUG9kY2FzdCIpDQoNCg0KI3NhdmUoZHJpbCwgcGV0ZXJkYW91LCBmaWxlID0iZHJpbGRvdSIpDQpjb21iPC1yYmluZChyZXNpc3Qsc2hhcmVibHVlX3JlZ2lvbixjaHVkLGRvbnV0LG1zbmJjLGxlZnQsIHJ1c3NpYSwgcG9kY2FzdCxqb3Vybm9zLHNhbmRlcnMsIHdlaXJkLCBtZWRpYSkjLCBmaWxlID0gInJlZ2lvbnNfYm90cy5yZGF0YSIpDQoNCmBgYA0KDQojIEludHJvIGFuZCBNZXRob2RzDQoNCkluIHRoaXMgYW5hbHlzaXMgSSBkZW1vbnN0cmF0ZSB0aGUgZXhpc3RlbmNlIG9mIGEgbmV0d29yayBvZiBhdXRvbWF0ZWQgcmV0d2VldCBib3RzIHRoYXQgYW1wbGlmeSBhIGxhcmdlIHNldCBvZiBlc3RhYmxpc2htZW50IERlbW9jcmF0cyBhbmQgbWVtYmVycyBvZiAiUmVzaXN0YW5jZSBUd2l0dGVyIi4gRm9yIGRhdGEgY29sbGVjdGlvbiwgSSB1c2VkIHRoZSBUd2l0dGVyIFNlYXJjaCBBUEkgdmlhIHRoZSBbcnR3ZWV0XShodHRwOi8vcnR3ZWV0LmluZm8vKSByIHBhY2thZ2UgdG8gb2J0YWluIHJldHdlZXRlcnMgb2YgdmFyaW91cyBhY2NvdW50cyBpbiBkaWZmZXJlbnQgY29tbXVuaXRpZXMuIA0KDQpUd28gcHJpbWFyeSBhbmFseXNlcyB3ZXJlIHVzZWQgdG8gZXhhbWluZSB0aGUgcmV0d2VldGVyIGRhdGEgc2V0cyBmb3IgZWFjaCBhY2NvdW50LCB0aGUgZmlyc3QgYmVpbmcgYWNjb3VudCBjcmVhdGlvbiBkYXRlIGRpc3RyaWJ1dGlvbnMuIFdoZW4gYW5hbHl6aW5nIGZvbGxvd2VycyBvciByZXR3ZWV0ZXJzIGZvciBzdXNwaWNpb3VzIHBhdHRlcm5zLCB0aGUgZGF0ZSBhbiBhY2NvdW50IGlzIGNyZWF0ZWQgaXMgYSB1c2VmdWwgZmVhdHVyZSB0byBsb29rIGF0IGJlY2F1c2UgaXQgaXMgaW1tdXRhYmxlLiBBIHVzZXIncyBhY2NvdW50IGNyZWF0aW9uIGRhdGUgKGkuZS4gd2hlbiB0aGV5IGpvaW5lZCB0d2l0dGVyKSBjYW5ub3QgYmUgY2hhbmdlZCBieSB0aGUgYWNjb3VudCBvd25lciwgc28gaXQgaXMgdXNlZnVsIGZvciBvYnNlcnZpbmcgaW50ZXJlc3RpbmcgcGF0dGVybnMgYXNzb2NpYXRlZCB3aXRoIGNsdXN0ZXJzIG9mIGFjY291bnRzIGNyZWF0ZWQgd2l0aGluIHNob3J0IHRpbWUgc3BhbnMuIEkgcmVjb21tZW5kIHRoZSBOWSBUaW1lcyBbRm9sbG93ZXIgRmFjdG9yeV0oaHR0cHM6Ly93d3cubnl0aW1lcy5jb20vaW50ZXJhY3RpdmUvMjAxOC8wMS8yNy90ZWNobm9sb2d5L3NvY2lhbC1tZWRpYS1ib3RzLmh0bWwpIGFydGljbGUgZm9yIHJlbGV2YW50IGJhY2tncm91bmQgcmVnYXJkaW5nIGhvdyBhY2NvdW50IGNyZWF0aW9uIGRhdGUgcGF0dGVybnMgY2FuIHJldmVhbCBmYWtlLCBvZnRlbiBwdXJjaGFzZWQsIGJvdCBmb2xsb3dlcnMuIEluIGNvbnRyYXN0IHRvIHRoZSBOWSBUaW1lcyBhcnRpY2xlLCB0aGlzIGFuYWx5c2lzIGZvY3VzZXMgb24gdGhlIGFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgdXNlcnMgdGhhdCByZXR3ZWV0IHBhcnRpY3VsYXIgYWNjb3VudHMsIHJhdGhlciB0aGFuIGZvbGxvd2Vycy4gDQoNClRoZSBzZWNvbmQgYW5hbHlzaXMsIHVzaW5nIGEgbWFjaGluZSBsZWFybmluZyBjbGFzc2lmaWNhdGlvbiB0ZWNobmlxdWUsIHdhcyBhIHByb2JhYmlsaXR5IGVzdGltYXRlIG9mIGFuIGFjY291bnQgYmVpbmcgYSBib3QuIEZvciB0aGlzLCBJIHVzZWQgdGhlIFt0d2VldGJvdG9ybm90XShodHRwczovL2dpdGh1Yi5jb20vbWtlYXJuZXkvdHdlZXRib3Rvcm5vdCkgciBwYWNrYWdlIHRvIGVzdGltYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiBlYWNoIHJldHdlZXRlciBiZWluZyBhbiBhdXRvbWF0ZWQgYWNjb3VudC4gQXMgaW4gdGhlIGFjY291bnQgY3JlYXRpb24gZGF0ZSBhbmFseXNpcywgZGlzdHJpYnV0aW9ucyBvZiBib3QgcHJvYmFiaWxpdGllcyB3ZXJlIHZpc3VhbGl6ZWQgdG8gZXhhbWluZSBhIGxhcmdlIG51bWJlciBvZiBhY2NvdW50cyBhdCBvbmNlLiBUaGUgZmFzdCB2ZXJzaW9uIG9mIHRoZSBhbGdvcml0aG0gY2FuIGJlIHRlc3RlZCBbaGVyZV0oaHR0cHM6Ly9taWtld2suc2hpbnlhcHBzLmlvL2JvdG9ybm90Lykgb24gc2luZ2xlIGFjY291bnRzIHVzaW5nIGFjY291bnQtbGV2ZWwgKGJpbywgdHdlZXQgdm9sdW1lLCBmb2xsb3dlciBhbmQgZnJpZW5kIGNvdW50LCBldGMuKSBkYXRhIG9ubHkuIFRvIG9idGFpbiBhIG1vcmUgYWNjdXJhdGUgZXN0aW1hdGUgb2Ygd2hldGhlciBhbiBhY2NvdW50IGlzIGEgYm90IG9yIG5vdCwgdHdlZXQtbGV2ZWwgKGNhcGl0YWxpemF0aW9uLCBoYXNodGFnIHVzZSwgbWVudGlvbnMsIGV0Yy4pIGRhdGEgd2FzIHVzZWQgaW4gYWRkaXRpb24gdG8gdGhlIGFjY291bnQtbGV2ZWwgZGF0YS4gSW4gdGhlIGZvbGxvd2luZyBhbmFseXNpcywgdHdlZXQtbGV2ZWwgZGF0YSBjb25zaXN0ZWQgb2YgcmV0d2VldGVyJ3MgbW9zdCByZWNlbnQgMTAwIHR3ZWV0cy4gVGhlIGdyYWRpZW50IGJvb3N0ZWQgbW9kZWwgKHVzaW5nIHRoZSBbZ2JtXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZ2JtL2luZGV4Lmh0bWwpIHBhY2thZ2UpIHVzZWQgdGhlIGNvbWJpbmF0aW9uIG9mIGFjY291bnQgYW5kIHR3ZWV0LWxldmVsIGRhdGEgdG8gZXN0aW1hdGUgdGhlIHByb2JhYmlsaXR5IHRoYXQgZWFjaCByZXR3ZWV0aW5nIGFjY291bnQgaXMgYSBib3QuDQoNClRoZSBwcm9jZWVkaW5nIHNlY3Rpb25zIGFyZSBvcmdhbml6ZWQgYXMgc3VjaDoNCg0KMS4gIERhdGEgY29sbGVjdGlvbiBtZXRob2RvbG9neQ0KDQoyLiAgQWNjb3VudCBjcmVhdGlvbiBkYXRlIGFuYWx5c2lzDQogICAgKyBFeGFtcGxlcw0KICAgICAgKyBBY2NvdW50IGNyZWF0aW9uIGRhdGUgYW5hbHlzaXMgdXNpbmcgMTAsMDAwIHJldHdlZXRlcnMgb2YgQFNoYXJlYmx1ZQ0KICAgICAgKyBhY2NvdW50IGNyZWF0aW9uIGRhdGUgYW5hbHlzaXMgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBhY2NvdW50cw0KICAgICsgQ29tcGFyaXNvbiBvZiBhY2NvdW50IGNyZWF0aW9uIGRhdGUgYW5hbHlzZXMgYWNyb3NzIGNvbW11bml0aWVzIHVzaW5nIDIsNDAwIHJldHdlZXRlcnMgcGVyIGFjY291bnQNCg0KMy4gIEJvdCBwcm9iYWJpbGl0eSBlc3RpbWF0ZXMNCiAgICArIEV4YW1wbGUgDQogICAgICArIEJvdCBwcm9iYWJpbGl0eSBhbmFseXNpcyB1c2luZyAxMCwwMDAgcmV0d2VldHMgb2YgQFNoYXJlYmx1ZQ0KICAgICAgKyBCb3QgcHJvYmFibHkgYW5hbHlzaXMgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byBhY2NvdW50cw0KICAgICsgQ29tcGFyaXNvbiBvZiBib3QgcHJvYmFiaWxpdGllcyBhY3Jvc3MgY29tbXVuaXRpZXMgdXNpbmcgMiw0MDAgcmV0d2VldHMgcGVyIGFjY291bnQNCiAgICArIEFsdGVybmF0ZSB2aXN1YWxpemF0aW9ucyBvZiBib3QgcHJvYmFiaWxpdGllcw0KDQo0LiAgQ29tYmluZWQgYWNjb3VudCBjcmVhdGlvbiBkYXRlIGFuZCBib3QgcHJvYmFiaWxpdHkgYW5hbHlzaXMNCg0KNS4gIENvbmNsdXNpb25zIGFuZCBmdXR1cmUgZGlyZWN0aW9ucw0KICAgIA0KIyBSZXR3ZWV0ZXIgZGF0YSBjb2xsZWN0aW9uDQoNClRvIG9idGFpbiBvbmx5IHJldHdlZXRzIG9mIGFuIHNwZWNpZmljIGFjY291bnQgKGkuZS4gQFNoYXJlYmx1ZSkgZnJvbSB0aGUgU2VhcmNoIEFQSSwgbWVudGlvbnMgYW5kIG9yaWdpbmFsIHR3ZWV0cyB3ZXJlIGRpc2NhcmRlZCBieSBmaWx0ZXJpbmcgb3V0IGFsbCB0d2VldHMgdGhhdCBkaWQgbm90IGhhdmUgIlNoYXJlYmx1ZSIgaW4gdGhlIHJldHdlZXRfc2NyZWVuX25hbWUgZmllbGQuIFRoaXMgcHJvY2VzcyB3YXMgcmVwZWF0ZWQgdW50aWwgMTAsMDAwIHJlY2VudCByZXR3ZWV0cyB3ZXJlIGdhdGhlcmVkIGZyb20gNSw1ODUgdW5pcXVlIGFjY291bnRzLiBUaGlzIHByb2Nlc3MgcHJvZHVjZWQgYWNjb3VudC1sZXZlbCBkYXRhIHdoaWNoIGluY2x1ZGVzIHRoZSBhY2NvdW50IGNyZWF0aW9uIGRhdGUuIFRvIG9idGFpbiB1bmlxdWUgcmV0d2VldGVycyBvbmx5LCB0aGlzIHByb2Nlc3MgY2FuIGJlIHJlcGVhdGVkIGluIGNvbmp1bmN0aW9uIHdpdGggZmlsdGVyaW5nIHRvIG9idGFpbiBvbmx5IGRpc3RpbmN0IHVzZXIgYWNjb3VudHMuDQoNCg0KIyBBY2NvdW50IENyZWF0aW9uIERhdGVzDQoNCiMjIEV4YW1wbGUgdXNpbmcgU2hhcmVibHVlIHJldHdlZXRlcnMNCg0KQmVsb3cgaXMgYSBoaXN0b2dyYW0gb2YgdGhlIGFjY291bnQgY3JlYXRpb24gZGF0ZXMgZnJvbSB0aGUgMTAsMDAwIHJldHdlZXQgQFNoYXJlYmx1ZSByZXR3ZWV0IGRhdGEgc2V0LiBUaGUgZGF0YSBkaXNwbGF5cyBhY2NvdW50IGNyZWF0aW9uIGRhdGVzIGZyb20gNSw1ODUgdW5pcXVlIHJldHdlZXRlcnMuIE1ha2Ugbm90ZSBvZiB0aGUgbGFyZ2Ugc3Bpa2UgaW4gYWNjb3VudHMgY3JlYXRlZCBhcm91bmQgMjAwOSBhbmQgZWFybHkgMjAxNy4gVGhlIDIwMDkgc3Bpa2UgaXMgdGhvdWdodCB0byBiZSBUd2l0dGVyJ3MgYmFubmVyIHllYXIsIHdoZW4gaXQgcmVhbGx5IGNhdWdodCBvbiBhbmQgZXZlcnlvbmUgbWFkZSBhbmQgYWNjb3VudC4gVGhlc2Ugc3Bpa2VzIGluIGFjY291bnQgY3JlYXRpb24gZGF0ZXMgY2FuIGJlIG9ic2VydmVkIGFyb3VuZCB0aGUgdGltZSBUd2l0dGVyIHdlbnQgbWFpbnN0cmVhbSBvdGhlciBjb3VudHJpZXMuIEJ1dCB3aGF0IGNvdWxkIGV4cGxhaW4gdGhlIGh1Z2Ugc3Bpa2UgaW4gYWNjb3VudCBjcmVhdGlvbnMgYXJvdW5kIEphbnVhcnkgMjAxNyB0aGF0IHJldHdlZXQgU2hhcmVibHVlPyBBbiBvcmdhbmljIGV4cGxhbmF0aW9uIGNvdWxkIGJlIHRoYXQgdGhlc2UgYWNjb3VudHMgd2VyZSBjcmVhdGVkIGJ5IHJlYWwgcGVvcGxlIGFyb3VuZCB0aGUgdGltZSBvZiB0aGUgaW5hdWd1cmF0aW9uIHRvIHJlc2lzdCBUcnVtcCBvbiBUd2l0dGVyLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3Qoc2hhcmVibHVlKStsYWJzKHRpdGxlID0gIlNoYXJlYmx1ZSByZXR3ZWV0ZXIgam9pbiBkYXRlcyIsIGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBmcm9tIDEwLDAwMCByZXR3ZWV0cyBvZiBTaGFyZWJsdWUiKQ0KYGBgDQoNCiMjIEV4YW1wbGUgY29tcGFyaW5nIHR3byBhY2NvdW50cw0KDQpOb3cgbGV0cyBjb21wYXJlIHRoZSBhY2NvdW50IGNyZWF0aW9uIGRhdGUgZGlzdHJpYnV0aW9ucyBvZiByZXR3ZWV0ZXJzIGZyb20gdHdvIGRpZmZlcmVudCBhY2NvdW50cy4gSGVyZSwgSSBoYXZlIGNvbGxlY3RlZCAyNDAwIHJlY2VudCB1bmlxdWUgcmV0d2VldGVycyBmcm9tIEBkcmlsIGFuZCBAcGV0ZXJkYW91IHRvIGlsbHVzdHJhdGUuIEhlcmUsIHRoZSBkaXN0cmlidXRpb24gb2Ygam9pbiBkYXRlcyBmb3IgQGRyaWwgaXMgcmVsYXRpdmVseSBmbGF0LCB3aGlsZSBAcGV0ZXJkYW91J3MgcmV0d2VldGVycyBoYXZlIHN0cm9uZyBzcGlrZXMgaW4gdGhlaXIgYWNjb3VudCBjcmVhdGlvbiBkYXRlcyBhcm91bmQgMjAwOSBhbmQgSmFudWFyeSAyMDE3Lg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3QocGV0ZXJkYW91LCBkcmlsLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKHRpdGxlID0gIlJldHdlZXRlciBhY2NvdW50IGNyZWF0aW9uIGRhdGVzOiBEcmlsIHZzIERhb3UiLCBjYXB0aW9uID0gIkFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgMjQwMCByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCmBgYA0KDQojIyBDb21wYXJpbmcgYWNjb3VudHMgYWNyb3NzIFR3aXR0ZXIgY29tbXVuaXRpZXMNCg0KVGhlIGZvbGxvd2luZyBzZWN0aW9uIGNvbXBhcmVzIGFjY291bnQgY3JlYXRpb24gZGF0ZSBkaXN0cmlidXRpb25zIHdpdGhpbiB2YXJpb3VzIFR3aXR0ZXIgY29tbXVuaXRpZXMgb3IgcmVnaW9ucy4gQ29tcGFyaW5nIGJldHdlZW4gcmVnaW9ucyBhbGxvd3MgdXMgdG8gZXhhbWluZSBob3cgdGhlIEphbnVhcnkgMjAxNyBwZWFrIGRpZmZlcnMgYmV0d2VlbiBhY2NvdW50cyBhbmQgYWNyb3NzIHJlZ2lvbnMuDQoNCiMjIFNoYXJlYmx1ZSByZWdpb24NCg0KRmlyc3QgdXAgYXJlIFNoYXJlYmx1ZSBhZmZpbGlhdGVkIGFjY291bnRzLiBUaGUgSmFuICcxNyBqb2luIGRhdGUgc3Bpa2VzIGNhbiBiZSBvYnNlcnZlZCBpbiB0aGUgcmV0d2VldGVyIGRpc3RyaWJ1dGlvbnMgb2YgZWFjaCBhY2NvdW50IHRvIHZhcnlpbmcgZGVncmVlcy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChzaGFyZWJsdWVfcmVnaW9uLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwIHJldHdlZXRlcnMiKQ0KYGBgDQoNCiMjIFJpZ2h0d2luZ2VyIHJlZ2lvbg0KDQpUaGUgam9pbiBkYXRlIGhpc3RvZ3JhbXMgb2YgdGhlIHJpZ2h0LXdpbmcgYWNjb3VudHMgbG9vayB0b3RhbGx5IGRpZmZlcmVudCB0aGFuIHRoZSBkaXN0cmlidXRpb25zIG9ic2VydmVkIGFib3ZlLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3QoY2h1ZCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpDQpgYGANCg0KIyMgV2VpcmQgcmVnaW9uDQoNCkFnYWluIHdlIHNlZSB0b3RhbGx5IGRpZmZlcmVudCBzZXQgb2Ygc2ltaWxhciBsb29raW5nIGRpc3RyaWJ1dGlvbnMgb2YgYWNjb3VudCBjcmVhdGVkIGRhdGVzIG9mIHRoZWlyIHJldHdlZXRlcnMuIFRoZSAyMDA5IHNwaWtlIGlzIHRoZSBvbmUgY29uc2lzdGVudCBmZWF0dXJlIG9ic2VydmVkIG9uIGFsbCBhY2NvdW50cywgd2hpbGUgdGhlIEphbi4gJzE3IHNwaWtlIGlzIG5vdGFibHkgYWJzZW50Lg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3Qod2VpcmQsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJBY2NvdW50IGNyZWF0aW9uIGRhdGVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKQ0KYGBgDQoNCg0KIyMgTGVmdHkgcmVnaW9uDQoNClRoaXMgc2V0IG9mIGxlZnR5IGFjY291bnRzIGFwcGVhcnMgbW9yZSBzaW1pbGFyIHRvIHRoZSBkaXN0cmlidXRpb25zIGluIHRoZSBXZWlyZCByZWdpb24uIFRoZSBwcm9tZW5hZGUgc3Bpa2VzIG5lYXIgMjAxNyBvbiAyLTMgb2YgdGhlc2UgYWNjb3VudHMgYWN0dWFsbHkgb2NjdXJyZWQgYXJvdW5kIDYgbW9udGhzIHByaW9yIHRvIEphbiAnMTcuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChsZWZ0LCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikNCmBgYA0KDQojIyBQb2RjYXN0IHJlZ2lvbg0KDQpUaGUgbGFyZ2VzdCBzcGlrZSBpcyBzZWVuIG9uIEBhcmF2b3NpcywgYSBjb25zZXJ2YXRpdmUgZGVtb2NyYXQuIFRoZW4gQGpvbmZhdnMgZm9sbG93ZWQgYnkgQGpvbmxvdmV0dCBhbHNvIHNhdyB0aGUgc3Bpa2UgYnV0IHRvIGxlc3Mgb2YgYSBkZWdyZWUuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChwb2RjYXN0LCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikNCmBgYA0KDQojIyBKb3VybmFsaXN0IHJlZ2lvbg0KDQpIZXJlIHRoZSBsYXJnZXN0IHNpZ25hbCBpcyBvYnNlcnZlZCBvbiB0aGUgZm91bmRlciBvZiBMYXdmYXJlLiBTbWFsbGVyIHNwaWtlcyBhcmUgc2VlbiBmb3Igd3JpdGVycyBmb3IgVm94IGFuZCBEYWlseSBCZWFzdC4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfY3JlYXRlZF9hdF9oaXN0KGpvdXJub3MsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnModGl0bGUgPSAiV3JpdGluZyBSZWdpb246IFJldHdlZXRlciBhY2NvdW50IGNyZWF0aW9uIGRhdGVzIiwgY2FwdGlvbiA9ICJBY2NvdW50IGNyZWF0aW9uIGRhdGVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKQ0KYGBgDQoNCiMjIFB1YmxpY2F0aW9uIHJlZ2lvbg0KDQpUaGUgc2lnbmFsIGlzIGFwcGFyZW50IGZvciBTaGFyZWJsdWUgYW5kIFBhbG1lclJlcG9ydC4gSXQgaXMgZGlmZmljdWx0IHRvIHRlbGwgaG93IG11Y2ggaXMgdGhlcmUgZm9yIE5ZVCBhbmQgVGhpbmtQcm9nLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3QobWVkaWEsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJBY2NvdW50IGNyZWF0aW9uIGRhdGVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKQ0KYGBgDQoNCiMjIFJlc2lzdCByZWdpb24NCg0KVGhlIEphbiAnMTcgc3Bpa2UgaXMgaW5jcmVkaWJseSBwcm9taW5lbnQgaW4gdGhlc2UgYmlnIHJlc2lzdGFuY2UgYWNjb3VudHMuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChyZXNpc3QsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJBY2NvdW50IGNyZWF0aW9uIGRhdGVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKQ0KYGBgDQoNCg0KDQoNCiMjIFRWIFJlZ2lvbg0KDQpMaWJlcmFsIHRlbGV2aXNpb24gbmV3cyBwdW5kaXRzIGFsc28gZGlzcGxheSB0aGUgSmFuJyAxNyBzaWduYWwsIHRvIHZhcnlpbmcgZGVncmVlcy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfY3JlYXRlZF9hdF9oaXN0KG1zbmJjLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikNCmBgYA0KDQoNCg0KIyMgUnVzc2lhZ2F0ZSBSZWdpb24NCg0KQWdhaW4sIHNhbWUgc2lnbmFsLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3QocnVzc2lhLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQWNjb3VudCBjcmVhdGlvbiBkYXRlcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikNCmBgYA0KDQojIyAjU3RpbGxXaXRoSGVyIHJlZ2lvbg0KDQpBZ2FpbiB3ZSBzZWUgdGhlIHNpZ25hbCBwcmVzZW50IGZvciBhY2NvdW50cyB0aGF0IGFyZSBlc3RhYmxpc2htZW50IGRlbW9jcmF0IGRlZmVuZGVycy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2NyZWF0ZWRfYXRfaGlzdChkb251dCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpDQpgYGANCg0KDQojIyAyMDIwIFByZXNpZGVudGlhbCByZWdpb24NCg0KSGVyZSBpdCBpcyBjbGVhciB0aGF0IHRoZSAyMDE3IHNpZ25hbCBpcyBsZXNzIGFwcGFyZW50IG9uIGJvdGggb2YgU2VuYXRvciBTYW5kZXIncyBhY2NvdW50cywgaG93ZXZlciBpdCBpcyBzdHJvbmcgb24gdGhlIG90aGVyIGFjY291bnRzLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9jcmVhdGVkX2F0X2hpc3Qoc2FuZGVycywgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkFjY291bnQgY3JlYXRpb24gZGF0ZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpDQpgYGANCg0KIyBCb3QgcHJvYmFiaWxpdHkgZXN0aW1hdGVzDQoNCkluIHRoaXMgc2VjdGlvbiwgaGlzdG9ncmFtcyBvZiBib3QgcHJvYmFiaWxpdGllcyBhcmUgdXNlZCB0byBleGFtaW5lIHRoZSBkaXN0cmlidXRpb24gb2YgcmVhbCB0byBmYWtlIGFjY291bnRzIHRoYXQgcmV0d2VldCBlYWNoIGFjY291bnQgYW5hbHl6ZWQuIDEwMCB0d2VldHMgZnJvbSBlYWNoIHJldHdlZXRlcidzIHRpbWVsaW5lIHdlcmUgY29sbGVjdGVkIGFuZCBjb21iaW5lZCB3aXRoIHRoZSBhY2NvdW50LWxldmVsIGRhdGUgaW4gb3JkZXIgdG8gcHJvdmlkZSBhIHByb2JhYmlsaXR5IGVzdGltYXRlIG9mIGVhY2ggcmV0d2VldGVyIGJlaW5nIGEgYm90Lg0KDQojIyMjIEV4YW1wbGUgZGF0YSBvdXRwdXQgYWZ0ZXIgY2xhc3NpZmljYXRpb246DQoNCmBgYHtyIGVjaG89RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9DQpzaGFyZWJsdWUNCmBgYA0KDQojIyBFeGFtcGxlIHVzaW5nIFNoYXJlYmx1ZSByZXR3ZWV0ZXJzDQoNCkJlbG93IGlzIGEgaGlzdG9ncmFtIG9mIHRoZSBlc3RpbWF0ZWQgYm90IHByb2JhYmlsaXRpZXMgb2YgdGhlIDUsNTg1IHVuaXF1ZSBhY2NvdW50cyB0aGF0IHJldHdlZXRlZCBTaGFyZWJsdWUuIA0KDQpUaGUgZGlzdHJpYnV0aW9uIGlzIGhpZ2hseSBza2V3ZWQtcmlnaHQsIGluZGljYXRpbmcgdGhhdCBtYW55IG9mIHRoZXNlIGFjY291bnRzIGFuYWx5emVkIGFyZSBoaWdobHkgbGlrZWx5IHRvIGJlIGF1dG9tYXRlZCBib3RzLg0KDQoNCmBgYGBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2JvdHByb2JfaGlzdChzaGFyZWJsdWUpK2xhYnModGl0bGUgPSAiU2hhcmVibHVlIHJldHdlZXRlciBib3QgcHJvYmFiaWxpdGllcyIsIGNhcHRpb24gPSAiRXN0aW1hdGVkIHByb2JhYmlsaXRpZXMgb2YgNSw1ODUgcmV0d2VldGVycyBiZWluZyBib3RzIikNCmBgYA0KDQoNCiMjIEV4YW1wbGUgY29tcGFyaW5nIHR3byBhY2NvdW50cw0KDQpOb3cgbGV0cyBjb21wYXJlIGJvdCBwcm9iYWJpbGl0eSBlc3RpbWF0ZSBkaXN0cmlidXRpb25zIG9mIHJldHdlZXRlcnMgZnJvbSB0d28gZGlmZmVyZW50IGFjY291bnRzLiBJIGhhdmUgY29sbGVjdGVkIDI0MDAgdW5pcXVlIHJldHdlZXRlcnMgZnJvbSBAZHJpbCBhbmQgQHBldGVyZGFvdSwgdGhlbiAxMDAgdHdlZXRzIGZyb20gZWFjaCByZXR3ZWV0ZXIncyB0aW1lbGluZSwgYW5kIGZpbmFsbHkgY2xhc3NpZmllZCBlYWNoIHJldHdlZXRlci4NCg0KV2UgY2FuIHNlZSB0aGF0IGRyaWwncyByZXR3ZWV0ZXJzIGFyZSBza2V3ZWQgbGVmdCAobGVzcyBsaWtlbHkgdG8gYmUgYm90cykgd2l0aCBhIGxhcmdlIHBlYWsuIFRoZSBkaXN0cmlidXRpb24gaXMgVS1zaGFwZWQsIHdpdGggYSBzbWFsbGVyIHBlYWsgb2YgYWJvdXQgMTAwIGFjY291bnRzIHRoYXQgYXJlIGhpZ2hseSBsaWtlbHkgdG8gYmUgYXV0b21hdGVkLiBUaGUgb3Bwb3NpdGUgaXMgdHJ1ZSBpbiBQZXRlciBEYW91J3MgY2FzZSwgd2l0aCB0aGUgcGVhayBvZiBwcm9iYWJpbGl0eSBlc3RpbWF0ZXMgYXJvdW5kIDkwJS4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KHBldGVyZGFvdSwgZHJpbCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyh0aXRsZSA9ICJSZXR3ZWV0ZXIgYm90IHByb2JhYmlsaXRpZXM6IERyaWwgdnMgRGFvdSIsIGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KVGhlIG1vc3QgaW1wb3J0YW50IG91dGNvbWUgdmFyaWFibGUgaXMgdGhlIHNoYXBlIG9mIHRoZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24uIElmIGl0IGlzIGEgcGVyZmVjdCBVIHNoYXBlIHdpdGggc3RlZXAgcGVha3MsIHRoZW4gdGhlIGFjY291bnQgaW4gcXVlc3Rpb24gaXMgbGlrZWx5IHJldHdlZXRlZCBieSBhIG1peCBvZiBvYnZpb3VzIGh1bWFucyBhbmQgYm90cy4gTGVmdCBza2V3IGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBtb3JlIHJldHdlZXRlcnMgY2xhc3NpZmllZCBhcyBodW1hbiB0aGFuIGJvdHMuIFJpZ2h0IHNrZXcgaW5kaWNhdGVzIHRoYXQgcmV0d2VldHMgYXJlIG1vcmUgbGlrZWx5IGF1dG9tYXRlZC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBpcyBmbGF0IG9yIGNvbnZleCwgdGhpcyB3b3VsZCBpbmRpY2F0ZSBhIGRlZXBlciBpc3N1ZSB3aXRoIHRoZSBjbGFzc2lmaWVyIGl0c2VsZi4gSWYgaXQgaXMgcGVyZm9ybWluZyBwcm9wZXJseSwgdGhlcmUgc2hvdWxkIGJlIGVpdGhlciBVLXNoYXBlIG9yIHNrZXdlZCBkaXN0cmlidXRpb25zIG9mIHByb2JhYmlsaXR5IGVzdGltYXRlcy4NCg0KDQpJbiB0aGUgZm9sbG93aW5nIGFuYWx5c2VzLCAyNDAwIHJldHdlZXRzIGFuZCByZXR3ZWV0ZXIgdXNlci90d2VldCBkYXRhIHdhcyBjb2xsZWN0ZWQgdG8gcHJvZHVjZSBwcm9iYWJpbGl0eSBlc3RpbWF0ZSBkaXN0cmlidXRpb25zIGZvciB0aGUgYWNjb3VudCBiZWluZyBhbmFseXplZC4gRm9yIHR3ZWV0LWxldmVsIGRhdGEgY29sbGVjdGlvbiwgMTAwIHJlY2VudCB0d2VldHMgZnJvbSBlYWNoIHJldHdlZXRlcidzIHRpbWVsaW5lIHdlcmUgb2J0YWluZWQgdGhyb3VnaCB0aGUgQVBJLg0KDQojIyBTaGFyZWJsdWUgcmVnaW9uDQoNClNoYXJlYmx1ZSBlbXBsb3llZXMgYW5kIGFmZmlsaWF0ZXMgaGFkIHNpbWlsYXJseSBza2V3ZWQtcmlnaHQgZGlzdHJpYnV0aW9ucywgaW5kaWNhdGluZyB0aGF0IHRoZWlyIHJldHdlZXRlcnMgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGJlIGF1dG9tYXRlZCBhY2NvdW50cy4NCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2JvdHByb2JfaGlzdChzaGFyZWJsdWVfcmVnaW9uLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KIyMgUmlnaHR3aW5nZXIgUmVnaW9uDQoNCkhlcmUgd2Ugc2VlIG1vcmUgVSBzaGFwZWQgZGlzdHJpYnV0aW9ucywgYnV0IGVhY2ggZGlzdHJpYnV0aW9uIGFsc28gc2tld3MtcmlnaHQgdG8gdmFyeWluZyBkZWdyZWVzLg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KGNodWQsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJCb3QgcHJvYmFiaWxpdGllcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCmBgYA0KDQojIyBXZWlyZCByZWdpb24NCg0KVGhpcyByZWdpb24gb2YgYWNjb3VudHMgYXBwZWFycyB0byBoYXZlIGEgdGhlIGxlYXN0IGFtb3VudCBvZiBhdXRvbWF0ZWQgcmV0d2VldHMsIGluZGljYXRlZCBieSB0aGUgc2tld2VkIGxlZnQgYW5kIFUtc2hhcGUgZGlzdHJpYnV0aW9ucy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KHdlaXJkLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KIyMgTGVmdHkgcmVnaW9uIA0KDQpUaGVzZSBtb3N0bHkgVS1zaGFwZWQgZGlzdHJpYnV0aW9ucyBpbmRpY2F0ZSBhIG1peCBvZiByZWFsIGFuZCBhdXRvbWF0ZWQgcmV0d2VldGVycy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KGxlZnQsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJCb3QgcHJvYmFiaWxpdGllcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCg0KYGBgDQoNCiMjIFBvZGNhc3QgcmVnaW9uDQoNClBvZGNhc3RlciBhY2NvdW50cyB2ZXJ5IGdyZWF0bHkgaW4gdGhlaXIgYm90IHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMuIFR3byBhY2NvdW50cyBza2V3LXJpZ2h0IHdoaWxlIHRoZSBvdGhlcnMgYXJlIG1vc3RseSBVLXNoYXBlIG9yIHNrZXctbGVmdC4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KHBvZGNhc3QsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJCb3QgcHJvYmFiaWxpdGllcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCmBgYA0KDQojIyBKb3VybmFsaXN0IHJlZ2lvbg0KDQpIZXJlIHdlIHNlZSBhIGxhcmdlIG1peCBvZiBkaXN0cmlidXRpb24gc2hhcGVzLiBAZWJydWVuaWcgd2FzIHRoZSBtb3N0IHNrZXdlZC1sZWZ0IGRpc3RyaWJ1dGlvbiBvZiBhbGwgYWNjb3VudHMgYW5hbHl6ZWQuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3Qoam91cm5vcyxjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KIyMgUHVibGljYXRpb24gcmVnaW9uDQoNCkhlcmUgd2UgaGF2ZSBhbm90aGVyIG1peCBvZiBkaXN0cmlidXRpb25zLiBTaGFyZWJsdWUgYW5kIFBhbG1lciBza2V3IGhlYXZpbHkgcmlnaHQsIGluZGljYXRpbmcgYXJ0aWZpY2lhbCBib29zdGluZy4gVGhlIG90aGVyIDMgYmVzaWRlcyBKYWNvYmluIHNrZXctcmlnaHQgYnV0IHN0aWxsIGhhdmUgY2xlYXIgVS1zaGFwZXMuIEphY29iaW4gaXMgdGhlIG9uZSBvbmUgdG8gc2tldyBsZWZ0Lg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3QobWVkaWEsY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkJvdCBwcm9iYWJpbGl0aWVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKStmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKQ0KYGBgDQoNCiMjIFJlc2lzdCByZWdpb24NCg0KVGhlc2UgZGlzdHJpYnV0aW9ucyBsb29rIHNpbWlsYXIgdG8gdGhvc2UgaW4gdGhlIFNoYXJlYmx1ZSByZWdpb24sIHdpdGggaGVhdnkgcmlnaHQtc2tldy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OX0NCnBsb3RfYm90cHJvYl9oaXN0KHJlc2lzdCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkJvdCBwcm9iYWJpbGl0aWVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKStmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKQ0KYGBgDQoNCiMjIFRWIFJlZ2lvbg0KVGhlc2UgZGlzdHJpYnV0aW9ucyBhcmUgaGlnaGx5IHNrZXdlZC1yaWdodCwgYnV0IGVhY2ggYWxzbyBoYXMgYSBzbGlnaHQgVS1zaGFwZS4gVGhpcyBpbmRpY2F0ZXMgYSBjb250aW5nZW50IG9mIHJlYWwgcmV0d2VldGVycyBhbW9uZyBtYW55IGF1dG9tYXRlZCBvbmVzLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3QobXNuYmMsIGNvbG9yID0gInJldHdlZXRlZCIpK2xhYnMoY2FwdGlvbiA9ICJCb3QgcHJvYmFiaWxpdGllcyBvZiAyNDAwICByZXR3ZWV0ZXJzIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkNCmBgYA0KDQoNCg0KIyMgUnVzc2lhR2F0ZSByZWdpb24NCg0KVGhlc2UgZGlzdHJpYnV0aW9ucyBsb29rIG11Y2ggbGlrZSBTaGFyZWJsdWUsIGFuZCBSZXNpc3QgcmVnaW9ucywgd2l0aCBoYXJkIHJpZ2h0LXNrZXcuIEhvd2V2ZXIgbW9zdCBkaXN0cmlidXRpb25zIGFsc28gaGF2ZSBhIG1vZGUgdG93YXJkcyAwJSwgc2ltaWxhciB0byB0aGUgVFYgcmVnaW9uIGRpc3RyaWJ1dGlvbnMuDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3QocnVzc2lhLCBjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQoNCmBgYA0KDQoNCg0KDQoNCiMjICNTdGlsbFdpdGhIZXINCg0KTW9yZSBvZiB0aGUgc2FtZSBsb29raW5nIGRpc3RyaWJ1dGlvbnMgYXMgdGhlIHJlc2lzdCByZWdpb24uIFNrZXdlZC1yaWdodCBieSB2YXJ5aW5nIGRlZ3JlZS4NCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTl9DQpwbG90X2JvdHByb2JfaGlzdChkb251dCwgY29sb3IgPSAicmV0d2VldGVkIikrbGFicyhjYXB0aW9uID0gIkJvdCBwcm9iYWJpbGl0aWVzIG9mIDI0MDAgIHJldHdlZXRlcnMiKStmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKQ0KDQpgYGANCg0KIyMgMjAyMCBQcmVzaWRlbnRpYWwgcmVnaW9uDQoNClRoaXMgc2V0IGlzIGludGVyZXN0aW5nLCBhbGwgZXhjZXB0IGZvciBAQmVybmllU2FuZGVycyBhbmQgQFNlblNhbmRlcnMgaGF2ZSBhIGRlY2VudCByaWdodC1za2V3LiBTYW5kZXJzIGFjY291bnRzIGhhdmUgYSByaWdodCBza2V3LCBidXQgYWxzbyBoYXZlIG1vcmUgb2YgYSBVLXNoYXBlLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD05fQ0KcGxvdF9ib3Rwcm9iX2hpc3Qoc2FuZGVycyxjb2xvciA9ICJyZXR3ZWV0ZWQiKStsYWJzKGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCAgcmV0d2VldGVycyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpDQpgYGANCg0KIyBWaXN1YWxpemluZyBpdCBhbGwgdG9nZXRoZXINCiMjIDIwMjAgUHJlc2lkZW50aWFsIHJlZ2lvbiBvbmx5DQpMb29raW5nIGF0IHNlcGFyYXRlIGhpc3RvZ3JhbXMgYWNyb3NzIGRpZmZlcmVudCB0d2l0dGVyIHJlZ2lvbnMgaXMgdG91Z2ggdG8gaW50ZXJwcmV0LiBUaGUgZGVuc2l0eSByaWRnZWxpbmUgcGxvdCBhbGxvd3MgZm9yIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnMgdG8gYmUgdmlld2VkIGluIHRoZSBhIHNwYWNlIHNpbWlsYXIgaW4gc2l6ZSB0byBhIHNpbmdsZSBoaXN0b2dyYW0uIA0KDQpIZXJlIGlzIHRoZSBkZW5zaXR5IHJpZGdlIHBsb3Qgb2YgdGhlIHNhbWUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBzZXQgb2YgMjAyMCBwcmVzaWRlbnRpYWwgcmVnaW9uIGhpc3RvZ3JhbXMuIFRoZSBhZGRlZCBjb2xvciwgcmVwcmVzZW50aW5nIGRlbnNpdHksIGFpZHMgdmlzdWFsIGNvbXByZWhlbnNpb24gb2YgcGVha3MgYW5kIG1vZGVzLiBUaGUgdXBwZXJtb3N0IGRpc3RyaWJ1dGlvbiBoYXMgdGhlIGxvd2VzdCBtZWFuIHJldHdlZXRlciBib3QgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uLCBhbmQgdGhlIGxvd2VybW9zdCBkaXN0cmlidXRpb24gYWx3YXlzIGhhcyB0aGUgZ3JlYXRlc3QgbWVhbiBib3QgcHJvYmFiaWxpdHkuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwbG90X2JvdHByb2JfcmlkZ2VzKHNhbmRlcnMpDQpgYGANCg0KIyMgQWxsIHJlZ2lvbnMsIHNlcGVyYXRlDQoNCkhlcmUgYWxsIHJlZ2lvbnMgYXJlIGdyb3VwZWQgYW5kIGRpc3BsYXllZCBpbiB0aGUgc2FtZSBwbG90LiBUaGUgb3ZlcmFsbCBza2V3IG9mIHRoZSBncm91cHMgYXMgd2VsbCBhcyBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbnMgYXJlIGVhc2lseSBpbnRlcnByZXRlZC4gIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb21iJT4lcGxvdF9ib3Rwcm9iX3JpZGdlcyhmaWxsID0gImRlbnMiLCBzY2FsZT0gMiwgb3B0aW9uID0gIkQiKStmYWNldF93cmFwKH5SZWdpb24sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMykrbGFicyh0aXRsZT0gIlJldHdlZXQgYXV0b21hdGlvbiBhbmQgYm90IHVzZSBhY3Jvc3MgZGlmZmVyZW50IHJlZ2lvbnMgb2YgVHdpdHRlciIsIHN1YnRpdGxlPSJZZWxsb3cgcGVha3MgZnVydGhlciB0byB0aGUgcmlnaHQgaW5kaWNhdGUgYSBncmVhdGVyIHByb3BvcnRpb24gb2YgcmV0d2VldHMgcmVjZWl2ZWQgd2VyZSBhdXRvbWF0ZWQiLCBjYXB0aW9uID0gIkJvdCBwcm9iYWJpbGl0aWVzIG9mIDI0MDAgcmVjZW50IHJldHdlZXRlcnMgcGVyIGFjY291bnQiKQ0KYGBgDQoNCiMjIEFsbCByZWdpb25zLCBjb21iaW5lZCANCkhlcmUgdGhlIGRlbnNpdHkgcmlkZ2VsaW5lcyBhcmUgc3RhY2tlZCB3aGljaCBhbGxvd3MgZm9yIHF1aWNrZXIgY29tcGFyaXNvbnMgYmV0d2VlbiBhY2NvdW50cyBpbiBkaWZmZXJlbnQgcmVnaW9ucy4NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0xNCwgZmlnLndpZHRoPTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjb21iJT4lcGxvdF9ib3Rwcm9iX3JpZGdlcyhmaWxsID0gImRlbnMiLCBzY2FsZT0gNiwgb3B0aW9uID0gIkQiKStsYWJzKHRpdGxlPSAiQm90IFByb2JhYmlsaXRpZXMgb2YgcmV0d2VldGVycyIsIHN1YnRpdGxlPSJPcmRlcmVkIGJ5IGFzY2VuZGluZyBhdmVyYWdlIHJldHdlZXRlciBib3QgcHJvYiIsIGNhcHRpb24gPSAiQm90IHByb2JhYmlsaXRpZXMgb2YgMjQwMCByZWNlbnQgcmV0d2VldGVycyBwZXIgYWNjb3VudCIpDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQojIENvbWJpbmVkIEpvaW4gRGF0ZSBhbmQgQm90IFByb2JhYmlsaXR5IEFuYWx5c2lzIA0KDQpUaGUgc3Bpa2VzIGluIHJldHdlZXRlcnMgd2l0aCBqb2luIGRhdGVzIGluIEphbnVhcnkgb2YgMjAxNyBhcmUgc3VzcGljaW91cy4gQSByZWFsbHkgc3Ryb25nIHNpZ25hbCBzZWVtcyB0byBiZSBwcmltYXJpbHkgcHJlc2VudCBvbiAiUmVzaXN0YW5jZSIgYW5kIG1haW5zdHJlYW0gZXN0YWJsaXNobWVudCBEZW1vY3JhdCBhY2NvdW50cy4gVG8gc2VlIHdoZXRoZXIgdGhlIGFjY291bnRzIHdpdGggSmFuIDIwMTcgam9pbiBkYXRlcyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgY2xhc3NpZmllZCBhcyBib3RzLCB3ZSB3aWxsIGZpcnN0IGNvbWJpbmUgdGhlIGJvdCBwcm9iYWJpbGl0eSBkYXRhIHNldHMgdGhhdCBoYXZlIHRoZSAyMDE3IHNpZ25hdHVyZToNCg0KLSBTaGFyZWJsdWUsIFJlc2lzdCwgVHJ1bXAtUnVzc2lhLCBhbmQgI1N0aWxsV2l0aEhlciBhY2NvdW50cw0KLSBBcmF2b3NpcyAmIGpvbmZhdnMgZnJvbSBwb2RjYXN0IHJlZ2lvbg0KLSBCZW4gV2l0dGxlcyBmcm9tIHdyaXRpbmcNCi0gUGFsbWVyUmVwb3J0IGFuZCBTaGFyZWJsdWUgZnJvbSBwdWJsaWNhdGlvbnMNCi0gS2FtYWxhIEhhcnJpcywgSm9lIEtlbm5lZHksIFNlbiBXYXJyZW4gYW5kIEpvZSBCaWRlbg0KDQoNCiMjIFNjYXR0ZXIgcGxvdCBvZiBhbGwgI1Jlc2lzdGFuY2UgYWNjb3VudHMNCg0KQSBzY2F0dGVyIHBsb3Qgd2l0aCB2ZXJ5IGxvdyBhbHBoYSBvbiB0aGUgcG9pbnRzIGdpdmVzIGFuIGlkZWEgb2Ygd2hlcmUgYWNjb3VudHMgYXJlIGNvbmNlbnRyYXRlZCBpbiB0ZXJtcyBvZiBqb2luIGRhdGUgYW5kIGJvdCBwcm9iYWJpbGl0eS4gDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCnJlc2lzdGFuY2UlPiVnZ3Bsb3QoYWVzKGFjY291bnRfY3JlYXRlZF9hdCwgcHJvYl9ib3QpKStnZW9tX3BvaW50KGFscGhhID0gLjAxKSt0aGVtZV9pcHN1bSgic2FucyIpKyBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjIgeWVhciIsIGRhdGVfbGFiZWxzID0gIicleSIsIGRhdGVfbWlub3JfYnJlYWtzID0gIjEgeWVhciIpK2xhYnMoeCA9ICJBY2NvdW50IENyZWF0aW9uIERhdGUiLCB5ID0gIkJvdCBQcm9iYWJpbGl0eSIpDQpgYGANCg0KIyMgSGVhdCBtYXBzDQojIyMgI1Jlc2lzdGFuY2UgYWNjb3VudHMsIGNvbWJpbmVkDQoNClZpc3VhbGl6aW5nIHRoZSBkYXRhIHVzaW5nIGEgaGVhdCBtYXAgaGVscHMgdG8gdmlzdWFsaXplIHdoZW4gYm90IGFjY291bnRzIHdlcmUgY3JlYXRlZC4gTWFueSBib3QgYWNjb3VudHMgd2VyZSBjcmVhdGVkIGR1cmluZyAyMDA5LiAyMDA5IHdhcyB0aGUgbW9zdCBmcmVxdWVudGx5IG9ic2VydmVkIGFjY291bnQgY3JlYXRpb24geWVhciwgYW5kIGl0IGFsc28gaGFkIHRoZSBncmVhdGVzdCBudW1iZXIgb2YgcmVhbCBhY2NvdW50cy4gSW50ZXJlc3RpbmdseSwgYSBoaWdoIGNvbmNlbnRyYXRpb24gb2YgYm90IGFjY291bnRzIHRoYXQgaGF2ZSBlYXJseSAyMDE3IGpvaW4gZGF0ZXMgd2FzIGFsc28gb2JzZXJ2ZWQuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9DQpyZXNpc3RhbmNlJT4lIGdncGxvdChhZXMoYWNjb3VudF9jcmVhdGVkX2F0LCBwcm9iX2JvdCkpK2dlb21fYmluMmQoYmlucyA9IDQwKStzY2FsZV9maWxsX3ZpcmlkaXMoKSt0aGVtZV9pcHN1bSgic2FucyIpICsgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIyIHllYXIiLCBkYXRlX2xhYmVscyA9ICInJXkiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHllYXIiKStsYWJzKHggPSAiQWNjb3VudCBDcmVhdGlvbiBEYXRlIiwgeSA9ICJCb3QgUHJvYmFiaWxpdHkiKQ0KYGBgDQoNCiMjIyAjUmVzaXN0YW5jZSBhY2NvdW50cywgc2VwZXJhdGUNCg0KVG8gc2VlIGhvdyB1bmlmb3JtIHRoZSBib3QgY3JlYXRpb24gZGF0ZXMgYXJlIGFjcm9zcyBhY2NvdW50cyB3ZSBjYW4gcGxvdCB0aGUgc2FtZSB2aXN1YWxpemF0aW9uIGZvciBlYWNoIGFjY291bnQgdGhhdCB3YXMgcmV0d2VldGVkLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTJ9DQpyZXNpc3RhbmNlJT4lZ2dwbG90KGFlcyhhY2NvdW50X2NyZWF0ZWRfYXQsIHByb2JfYm90KSkrZ2VvbV9iaW4yZChiaW5zID0gMTApK3NjYWxlX2ZpbGxfdmlyaWRpcygpK3RoZW1lX2lwc3VtKCJzYW5zIikrZmFjZXRfd3JhcCh+cmV0d2VldF9zY3JlZW5fbmFtZSkgKyBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjIgeWVhciIsIGRhdGVfbGFiZWxzID0gIicleSIsIGRhdGVfbWlub3JfYnJlYWtzID0gIjEgeWVhciIpK2xhYnMoeCA9ICJBY2NvdW50IENyZWF0aW9uIERhdGUiLCB5ID0gIkJvdCBQcm9iYWJpbGl0eSIpDQpgYGANCg0KIyMgRGVuc2l0eSBwbG90cw0KDQpUaGUgYWJvdmUgaGVhdCBtYXBzIGFyZSBzaW1pbGFyIHRvIGhpc3RvZ3JhbXMgaW4gdGhhdCB0aGV5IHVzZSBiaW5zIHRvIHNwbGl0IHVwIHRoZSBkYXRhLiANCg0KVGhlIHBsb3QgYmVsb3cgdXNlcyB0aGUgMmQgZGVuc2l0eSB0byBtYXAgdGhlIGNvbG9yIGZpbGwgdmFsdWUgdG8uIFRoaXMgc21vb3RoZWQgdmlzdWFsaXphdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gY29tcGFyZSBkZW5zaXRpZXMgb2YgYWNjb3VudCBjcmVhdGlvbiBkYXRlcyBhbmQgYm90IHByb2JhYmlsaXRpZXMgYWNyb3NzIGFjY291bnRzLg0KDQojIyMgI1Jlc2lzdGFuY2UgYWNjb3VudHMsIGNvbWJpbmVkDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQ0KcmVzaXN0YW5jZSU+JWdncGxvdChhZXMoYWNjb3VudF9jcmVhdGVkX2F0LCBwcm9iX2JvdCkpK3N0YXRfZGVuc2l0eTJkKGdlb20gPSAidGlsZSIsIGFlcyhmaWxsPS4uZGVuc2l0eS4uKSwgY29udG91ciA9IEYpK3NjYWxlX2ZpbGxfdmlyaWRpcygpK3RoZW1lX2lwc3VtKCJzYW5zIikgKyBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjIgeWVhciIsIGRhdGVfbGFiZWxzID0gIicleSIsIGRhdGVfbWlub3JfYnJlYWtzID0gIjEgeWVhciIpK2xhYnMoeCA9ICJBY2NvdW50IENyZWF0aW9uIERhdGUiLCB5ID0gIkJvdCBQcm9iYWJpbGl0eSIpDQpgYGANCiMjIyAjUmVzaXN0YW5jZSBhY2NvdW50cywgc2VwZXJhdGUNClRoZSBzdHJvbmdlc3Qgc2lnbmFsIGlzIG9ic2VydmVkIG9uIE1hZGRvdydzIGFjY291bnQuDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTJ9DQpyZXNpc3RhbmNlJT4lZ2dwbG90KGFlcyhhY2NvdW50X2NyZWF0ZWRfYXQsIHByb2JfYm90KSkrc3RhdF9kZW5zaXR5MmQoZ2VvbSA9ICJ0aWxlIiwgYWVzKGZpbGw9Li5kZW5zaXR5Li4pLCBjb250b3VyID0gRikrc2NhbGVfZmlsbF92aXJpZGlzKCkrdGhlbWVfaXBzdW0oInNhbnMiKStmYWNldF93cmFwKH5yZXR3ZWV0X3NjcmVlbl9uYW1lKSArIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiMiB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSAiJyV5IiwgZGF0ZV9taW5vcl9icmVha3MgPSAiMSB5ZWFyIikrbGFicyh4ID0gIkFjY291bnQgQ3JlYXRpb24gRGF0ZSIsIHkgPSAiQm90IFByb2JhYmlsaXR5IikNCmBgYA0KDQojIyMgQ29tcGFyaXNvbiBvZiBUViB3aXRoIG90aGVyIHJlZ2lvbnMNCk5vdywgbGV0cyBjb21wYXJlIGFjY291bnRzIGluIHRoZSBUViByZWdpb24gd2l0aCB0aGUgbGVmdHkgYW5kIHdlaXJkIHJlZ2lvbnMuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0NCnJiaW5kKGxlZnQsIHdlaXJkLCBtc25iYyklPiVnZ3Bsb3QoYWVzKGFjY291bnRfY3JlYXRlZF9hdCwgcHJvYl9ib3QpKStzdGF0X2RlbnNpdHkyZChnZW9tID0gInRpbGUiLCBhZXMoZmlsbD0uLmRlbnNpdHkuLiksIGNvbnRvdXIgPSBGKStzY2FsZV9maWxsX3ZpcmlkaXMoKSt0aGVtZV9pcHN1bSgic2FucyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpICsgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIyIHllYXIiLCBkYXRlX2xhYmVscyA9ICInJXkiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHllYXIiKStsYWJzKHggPSAiQWNjb3VudCBDcmVhdGlvbiBEYXRlIiwgeSA9ICJCb3QgUHJvYmFiaWxpdHkiKQ0KYGBgDQoNCg0KIyMjIDIwMjAgUHJlc2lkZW50aWFsIHJlZ2lvbg0KRmluYWxseSwgbGV0cyBjb21wYXJlIHRoZSBwcmVzaWRlbnRpYWwgaG9wZWZ1bHMuIEl0IGxvb2tzIGxpa2UgS2FtYWxhIEhhcnJpcyBoYXMgdGhlIG1vc3QgMjAxNyByZXR3ZWV0IGJvdHMgb2YgdGhlc2UgYWNjb3VudHMsIGZvbGxvd2VkIGJ5IEpvZSBLZW5uZWR5IGFuZCBKb2UgQmlkZW4uIE5laXRoZXIgb2YgQmVybmllIFNhbmRlcnMnIGFjY291bnRzIGFyZSAgYm9vc3RlZCBieSBhdXRvbWF0ZWQgcmV0d2VldCBib3RzIHRvIHRoZSBkZWdyZWUgdGhhdCBLYW1hbGEgSGFycmlzIG9yIEpvZSBLZW5uZWR5IGFyZS4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwfQ0KcmJpbmQoc2FuZGVycyklPiVnZ3Bsb3QoYWVzKGFjY291bnRfY3JlYXRlZF9hdCwgcHJvYl9ib3QpKStzdGF0X2RlbnNpdHkyZChnZW9tID0gInRpbGUiLCBhZXMoZmlsbD0uLmRlbnNpdHkuLiksIGNvbnRvdXIgPSBGKStzY2FsZV9maWxsX3ZpcmlkaXMoKSt0aGVtZV9pcHN1bSgic2FucyIpK2ZhY2V0X3dyYXAofnJldHdlZXRfc2NyZWVuX25hbWUpICsgc2NhbGVfeF9kYXRldGltZShkYXRlX2JyZWFrcyA9ICIyIHllYXIiLCBkYXRlX2xhYmVscyA9ICInJXkiLCBkYXRlX21pbm9yX2JyZWFrcyA9ICIxIHllYXIiKStsYWJzKHggPSAiQWNjb3VudCBDcmVhdGlvbiBEYXRlIiwgeSA9ICJCb3QgUHJvYmFiaWxpdHkiKQ0KDQpgYGANCiMgRm9sbG93ZXIgYW5hbHlzaXMgDQoNCkkgaGF2ZSBhbHNvIG9ic2VydmVkIGFjY291bnRzIGNyZWF0ZWQgYXJvdW5kIEphbnVhcnkgMjAxNyB0aGF0IGhhdmUgYmVlbiBmb2xsb3dpbmcsIGluIGFkZGl0aW9uIHRvIHJldHdlZXRpbmcsIHRoZSBhY2NvdW50cyBpbiBxdWVzdGlvbi4gRm9yIGV4YW1wbGUsIEBLYW1hbGFIYXJyaXMgaGFzIGJlZW4gcmVjZWl2aW5nIGZvbGxvd3MgZnJvbSBhY2NvdW50cyBjcmVhdGVkIGluIEphbiAnMTcgc2luY2Ugc2hvcnRseSBhZnRlciB0aGUgc2VuYXRvcidzIGFjY291bnQgd2FzIGNyZWF0ZWQuIEl0IGFwcGVhcnMgdGhhdCB0aGVzZSBib3QgZm9sbG93cyBhcmUgZW5naW5lZXJlZCB0byBwcm92aWRlIGEgc3VzdGFpbmVkIGZsb3cgb2YgbmV3IGZvbGxvd2VycyB0byB0aGUgYWNjb3VudCBvdmVyIGEgbG9uZyBwZXJpb2Qgb2YgdGltZS4gVGhpcyBpcyBldmlkZW5jZWQgYnkgdGhlIGhvcml6b250YWwgY2x1c3RlciBvZiBmb2xsb3dzIGNyZWF0ZWQgYXJvdW5kIEphbicxNy4gQWRkaW5nIG5ldyBib3QgZm9sbG93cyB0byBhbiBhY2NvdW50IGF0IGEgc2xvdyBhbmQgc3VzdGFpbmVkIHBhY2UgYWNjb21wbGlzaGVzIGEgZmV3IHRoaW5ncywgMSkgcGVvcGxlIGRvbid0IGdldCBzdXNwaWNpb3VzIHdoZW4gYW4gYWNjb3VudCBnYWlucyAxMDBrIGZvbGxvd2VycyBvdmVybmlnaHQsIDIpIG5vIGJ1cnN0IG9mIGZvbGxvd2VycyBtZWFucyB0aGF0IHRoZSAiY3J1c3QgYXQgdGhlIHRvcCIgZHVlIHRvIHRoZSAiam9pbiBhbmQgZm9sbG93IiBwaGVub21lbmEgZGVzY3JpYmVkIGluIHRoZSBOWVQgYXJ0aWNsZSByZW1haW5zIHVuYnJva2VuIChwdXJjaGFzaW5nIGZvbGxvd2VycyBpbiBidWxrIG9mdGVuIGJyZWFrcyB0aGUgY29udGludWl0eSBvZiB0aGUgZGFyayBjcnVzdCBhdCB0aGUgdG9wIG9mIHRoZSBwbG90KSwgYW5kIDMpIHN1c3RhaW5pbmcgdGhlIGZsb3cgb2YgbmV3IGZvbGxvd2VycyBsaWtlbHkgaGVscHMgdG8ga2VlcCBhbiBhY2NvdW50IHRyZW5kaW5nIGZvciBsb25nZXIgdGhhbiBpdCB3b3VsZCBoYXZlIG90aGVyd2lzZSBzbyB0aGUgYWNjb3VudCBzaG93cyB1cCBpbiBzdWdnZXN0ZWQgZm9sbG93cywgZXRjLg0KDQohW10oLi9rYW1hbGFoYXJyaXNfZmx3cnMucG5nKQ0KDQojIENvbmNsdXNpb24NCg0KSXQgaXMgY2xlYXIgZnJvbSB0aGUgYWJvdmUgYW5hbHlzZXMgdGhhdCB0aGVyZSBhcmUgYXV0b21hdGVkIHJldHdlZXQgYm90cyB0aGF0IGJvb3N0IHRob3NlIHdobyBhcmUgaW4gYW5kL29yIGRlZmVuZCB0aGUgZXN0YWJsaXNobWVudCBEZW1vY3JhdCBwYXJ0eS4NCiANClRoZXNlIGFtcGxpZmllciBhY2NvdW50cyBkb24ndCByZXR3ZWV0IGZyb20gdGhpcmQtcGFydHkgY2xpZW50cyAobGlrZSBTYWxseSBBbGJyaWdodCB3YXMgZG9pbmcpIHNvIHRoZWlyIGV4aXN0ZW5jZSBtdXN0IGJlIGNvbmZpcm1lZCBzdGF0aXN0aWNhbGx5LS0gdGhleSBhcmUgaW52aXNpYmxlIHRvIGEgc2luZ2xlIEFQSSBjYWxsIHRvIGdldCB0aGUgc291cmNlIGNsaWVudC4gVGhleSBhcHBlYXIgdG8gdXNlIChvciBlbXVsYXRlKSBhbmRyb2lkLCBpUGhvbmUsIGFuZCB3ZWIgY2xpZW50IHNvdXJjZSBjbGllbnRzIGF0IGFib3V0IGVxdWFsIHJhdGVzLiBGdXJ0aGVyLCB0aGUgYWNjb3VudHMgZG8gbm90IGhhdmUgcmV2ZXJzZS1pbWFnZSBzZWFyY2hhYmxlIHByb2ZpbGUgcGljdHVyZXMtLSB0aGV5IGFyZSB0eXBpY2FsbHkgcGljdHVyZXMgb2YgcGV0cywgbG9nb3MsIG9yIG9ic2N1cmVkIGZhY2VzLiANCg0KVGhlIHNjb3BlIG9mIHRoaXMgQXN0cm9UdXJmIG9wZXJhdGlvbiBpcyB2YXN0LiBDcmVhdGlvbiBvZiBhbiBhdXRvbWF0ZWQgYWNjb3VudCBuZXR3b3JrIHRoaXMgYWR2YW5jZWQgbGlrZWx5IGludm9sdmVkIGEgbWFzc2l2ZSB0ZWNobmljYWwgYW5kIGZpbmFuY2lhbCB1bmRlcnRha2luZy4gDQoNCiMgRnV0dXJlIGRpcmVjdGlvbnMNCg0KTmV4dCBzdGVwcyBhcmUgdG86DQoNCjEuIEdldCBhIGJldHRlciBpZGVhIGZvciB0aGUgc2NvcGUgb2YgdGhlIGJvdCBuZXQNCiAgICArIEhvdyBiaWcgaXMgaXQ/IA0KICAgICsgSXMgaXQgc3RpbGwgZ3Jvd2luZz8gDQoyLiBSZXZlcnNlIGVuZ2luZWVyIGhvdyB0aGUgbmV0d29yayBvcGVyYXRlcw0KICAgICsgVHJhY2sgZG93biB0aGUgd2F0Y2hlciBib3RzIGFuZCB0aGUgYW1wbGlmaWVycw0KICAgICsgQXJlIHRoZXkgaWRsZSB3YWl0aW5nIHRvIGdldCBhY3RpdmF0ZWQsIG9yIHBvc3RpbmcgY29uc3RhbnRseT8NCjMuIE5hcnJvdyBkb3duIHRoZSBKYW4nMTcgYWNjb3VudHMgdGhhdCBhcmUgbGlrZWx5IGJvdHMNCiAgICArIENvbmZpcm0gdGhhdCB0aGV5IGFyZSB1c2luZyB0aW1lIG1hcHBpbmcgYW5hbHlzZXMuIA0KICAgICsgVXNlIHRoaXMgdG8gZGV2ZWxvcCBhIG1vcmUgZGlyZWN0IHdheSBvZiBpZGVudGlmeWluZyBib3RzIGluIHRoZSBuZXR3b3JrDQoNCg==